常量
const a = 5
    // a = 7;
console.log(a);

什么是解构赋值？ 我们先看看传统的做法， 如何把一个数组的元素分别赋值给几个变量：
var arr = [
    ['我是熊大'],
    ['我是喜羊羊'],
    ['我是懒洋洋']
]
var b = arr[0]
var c = arr[1]
var d = arr[2]
console.log(b);
console.log(c);
console.log(d);


现在， 在ES6中， 可以使用解构赋值， 直接对多个变量同时赋值：
var [aa, bb, cc] = [
    ['我是美羊羊'],
    ['我是沸羊羊'],
    ['我是懒洋洋']
]
console.log('aa' + aa, 'bb' + bb, 'cc' + cc);


如果数组本身还有嵌套， 也可以通过下面的形式进行解构赋值， 注意嵌套层次和位置要保持一致：
var [aa, [bb, cc]] = [
    ['我是美羊羊'],
    ['我是沸羊羊', '我是懒洋洋']
]
console.log('aa' + aa, 'bb' + bb, 'cc' + cc);


解构赋值还可以忽略某些元素：
var [, , cc] = [
    ['我是美羊羊'],
    ['我是沸羊羊'],
    ['我是懒洋洋']
]
console.log('  ' + aa, '  ' + bb, 'cc' + cc);

如果需要从一个对象中取出若干属性， 也可以使用解构赋值， 便于快速获取对象的指定属性：
var pig = {
    name: '路路通',
    sex: '男',
    classid: 001,
    address: {
        city: '中国',
        live: '水帘洞',
        street: '番城街道'

    },
    class1: '软件一班'
}


对一个对象进行解构赋值时， 同样可以直接对嵌套的对象属性进行赋值， 只要保证对应的层次是一致的：
var { name, sex, address: { city, ll, street } } = pig
console.log({ name, sex, address: { city, ll, street } });


使用解构赋值对对象属性进行赋值时， 如果对应的属性不存在， 变量将被赋值为undefined，
这和引用一个不存在的属性获得undefined是一致的。 如果要使用的变量名和属性名不一致， 可以用下面的语法获取：
var { name, classid: id } = pig

console.log({ name, classid: id });

解构赋值还可以使用默认值， 这样就避免了不存在的属性返回undefined的问题：
var { name, tiger = true } = pig

console.log({ name, tiger = true });


// // 有些时候，如果变量已经被声明了，再次赋值的时候，正确的写法也会报语法错误：

// // 声明变量:
// var x, y;
// // 解构赋值:
// {x, y} = { name: '小明', x: 100, y: 200};
// // 语法错误: Uncaught SyntaxError: Unexpected token =
// 这是因为JavaScript引擎把{开头的语句当作了块处理，于是=不再合法。解决方法是用小括号括起来：

// ({x, y} = { name: '小明', x: 100, y: 200});
// 使用场景 解构赋值在很多时候可以大大简化代码。例如，交换两个变量x和y的值，可以这么写，不再需要临时变量：

// var x=1, y=2;
// [x, y] = [y, x]
// 快速获取当前页面的域名和路径：

// var {hostname:domain, pathname:path} = location;
// 如果一个函数接收一个对象作为参数，那么，可以使用解构直接把对象的属性绑定到变量中。例如，下面的函数可以快速创建一个Date对象：

// function buildDate({year, month, day, hour=0, minute=0, second=0}) {
//     return new Date(year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second);
// }

function DATE(t = year, month, day) {
    return new Date(year + '-' + month + '-' + day)

}

DATE({ year: 2020, month: 11, day: 5 })
    // 它的方便之处在于传入的对象只需要year、month和day这三个属性：

// buildDate({ year: 2017, month: 1, day: 1 });
// // Sun Jan 01 2017 00:00:00 GMT+0800 (CST)
// 也可以传入hour、minute和second属性：

// buildDate({ year: 2017, month: 1, day: 1, hour: 20, minute: 15 });
// // Sun Jan 01 2017 20:15:00 GMT+0800 (CST)